/* =============================================================================
 * PROJET           	: repartition
 * NOM DU FICHIER   	: chargement.c
 * OBJET            	: Definition des fonctions de chargement des donnees
 * -----------------------------------------------------------------------------
 * DATE DE CREATION 	: 27/10/2009
 * AUTEUR           	: Sha LIU, Yves BOGE
 * ============================================================================= */

#include "chargement.h"

/* description :	procedure de chargement des données de base du probleme.
 * entree :			nom du fichier contenant le probleme et la solution de départ
 * sortie :			pointeur vers un element de type t_donnees_pb
 */
int lire_fichier(char* in_nom_fichier, t_donnees_pb* pb) {
	
	FILE* fichier = NULL;
	char ligne[TAILLE_MAX];
	char* mot;
	int i;
	
	fichier = fopen(in_nom_fichier, "r");
	
	
	if (fichier != NULL) {
		//printf("fichier ouvert\n");
		
		if ( fgets(ligne, TAILLE_MAX, fichier) != NULL ) {
			// initialisation :
			pb->nb_pop = 0;
			pb->nb_sieges = 0;
			
			// initialisation des attributs de gestion de la liste des solutions
			pb->nb_sol = 1;
			pb->sol_suiv = NULL;
		
			// recuperation de la region :
			if ( (mot = strtok(ligne, ";")) ) {
				pb->region = malloc( strlen(mot) * sizeof(char) + 1);
				strcpy( pb->region, mot );
			}
			
			// recuperation du nombre de departement :
			if ( (mot = strtok(NULL, ";")) ) {
				pb->nb_pop = atoi(mot);
			}
			
			// recuperation du nombre de sieges :
			if ( (mot = strtok(NULL, ";")) ) {
				pb->nb_sieges = atoi(mot);
			}
			
			/*
			printf("region :\t\t\t%s\n", pb->region);
			printf("nombre de departements :\t%i\n", pb->nb_pop);
			printf("nombre de sieges :\t\t%i\n", pb->nb_sieges); */
			
			// creation du tableau des departements :
			pb->dep = malloc( pb->nb_pop * sizeof(t_dep) );
			
			// on recupere les donnees pour chaque departement
			for ( i = 0 ; i < pb->nb_pop ; i++ ) {
				if ( fgets(ligne, TAILLE_MAX, fichier) != NULL ) {
					//printf( "recuperation des informations concernant le departement n°%i\n", i + 1 );
					
					// nom du departement :
					mot = strtok(ligne, ";");
					(pb->dep + i)->nom = malloc( strlen(mot) * sizeof(char) + 1);
					strcpy( (pb->dep + i)->nom, mot );
			
					// population du departement :
					mot = strtok(NULL, ";");
					(pb->dep + i)->pop = atoi(mot);
			
					// repartition courante pour le departement :
					mot = strtok(NULL, ";");
					(pb->dep + i)->rep = atoi(mot);
					
					//printf( "\tdepartement : %s\t\t, population : %i\t, repartition : %i\n", (pb->dep + i)->nom, (pb->dep + i)->pop, (pb->dep + i)->rep );
				}
				else
					printf( "aucune information concernant le departement n°%i\n", i + 1 );
			}
			//printf( "fichier charge\n" );
			
			return 1;
		}
		else {
			printf("Le fichier est vide\n");
			return 0;
		}
		fclose(fichier);
	}
	else {
		printf("Impossible d'ouvrir le fichier\n");
		return 0;
	}
}



/* description :	procedure copiant les donnees du probleme
 * entree :			donnees du probleme a copier
 * sortie :			pointeur vers les donnees du probleme copie
 */
t_donnees_pb* copier_probleme(t_donnees_pb* pb) {

	t_donnees_pb* copie = malloc( sizeof(t_donnees_pb) );
	int i = 0;
	
	// On copie les informations generales
	copie->region = malloc( strlen( pb->region ) * sizeof(char) + 1);
	strcpy( copie->region, pb->region );
	copie->nb_pop = pb->nb_pop;
	copie->nb_sieges = pb->nb_sieges;
	copie->nb_sol = pb->nb_sol;
	copie->sol_suiv = pb->sol_suiv;
	
	// Allocation memoire pour le tableau des departements
	copie->dep = malloc( sizeof(t_dep) * copie->nb_pop );
	
	// On copie les informations de chaque departement
	for ( i = 0 ; i < pb->nb_pop ; i++ ) {
		// nom
		(copie->dep + i)->nom = malloc( strlen((pb->dep + i)->nom) * sizeof(char) + 1);
		strcpy( (copie->dep + i)->nom, (pb->dep + i)->nom );
		
		// population et repartition
		(copie->dep + i)->pop = (pb->dep + i)->pop;
		(copie->dep + i)->rep = (pb->dep + i)->rep;
		
		// fonction f(x)
		(copie->dep + i)->fx = (pb->dep + i)->fx;
		(copie->dep + i)->fmoins = (pb->dep + i)->fmoins;
		(copie->dep + i)->fplus = (pb->dep + i)->fplus;
	}
	
	return copie;
}

